﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FinanSoft.Entities;
using FinanSoft.BusinessLayer;
using FinanSoft.Utilities;
using System.Xml;
using System.Data.SqlClient;

namespace FinanSoft.PresentacionAdministracion
{
    public partial class frmConfigCuentas : Form
    {
        private List<int> _specialTypeAccountIds = new List<int>();
        private List<int> _specialAccountIds = new List<int>();
        private List<int> _notSpecialAccountIds = new List<int>();

        public frmConfigCuentas()
        {
            InitializeComponent();
            agregarTipoCuentaEsp();            
        }

        // Funcion que me va metiendo en un combobox todos los Tipos de cuenta especial
        private void agregarTipoCuentaEsp()
        {
            cmbTipoCuentaEsp.Items.Clear();

            SpecialAccount[] arregloTipoCuentaEsp = ConfigurationManager.GetInstance().GetSpecialAccountType();

            for (int ele = 0; ele < arregloTipoCuentaEsp.Length; ele++)
            {
                cmbTipoCuentaEsp.Items.Add(arregloTipoCuentaEsp[ele].Name);
                _specialTypeAccountIds.Insert(ele, arregloTipoCuentaEsp[ele].Id);
            }

            cmbTipoCuentaEsp.SelectedIndex = 0;

        }

        // Funcion que me va metiendo en un listbox todas las cuentas especiales
        private void agregarCuentaEsp()
        {
            // Cargamos y mostramos el formulario Crear Moneda
            if (cmbTipoCuentaEsp.SelectedIndex == -1)
                MessageBox.Show(MessageConstants.NO_SELECTED_SPECIAL_ACCOUNT_TYPE, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else
            {
                //Extrae el id del tipo de cuenta especial seleccionado
                int idTipoCtaEsp = _specialTypeAccountIds[cmbTipoCuentaEsp.SelectedIndex];
 
                SpecialAccount[] arregloCuentaEsp = ConfigurationManager.GetInstance().GetSpecialAccount(idTipoCtaEsp);

                for (int ele = 0; ele < arregloCuentaEsp.Length; ele++)
                {
                    lbCtaEsp.Items.Add(arregloCuentaEsp[ele].Name);
                    _specialAccountIds.Insert(ele, arregloCuentaEsp[ele].idCuenta);
                }
            }

        }

        // Funcion que me va metiendo en un listbox todas las cuentas no especiales
        private void agregarCuentaNoEsp()
        {
            // Cargamos y mostramos el formulario Crear Moneda
            if (cmbTipoCuentaEsp.SelectedIndex == -1)
                MessageBox.Show(MessageConstants.NO_SELECTED_SPECIAL_ACCOUNT_TYPE, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else
            {
                //Extrae el id del tipo de cuenta especial seleccionado
                int idTipoCtaEsp = _specialTypeAccountIds[cmbTipoCuentaEsp.SelectedIndex];

                SpecialAccount[] arregloCuentaNoEsp = ConfigurationManager.GetInstance().GetNotSpecialAccount(idTipoCtaEsp);

                for (int ele = 0; ele < arregloCuentaNoEsp.Length; ele++)
                {
                    lbCtaComp.Items.Add(arregloCuentaNoEsp[ele].Name);
                    _notSpecialAccountIds.Insert(ele, arregloCuentaNoEsp[ele].idCuenta);
                }
            }

        }

        // Funcion que agrega una nueva cuenta especial
        private void agregarNuevaCuentaEsp()
        {
            if (lbCtaComp.SelectedIndex == -1)
                MessageBox.Show(MessageConstants.NO_SELECTED_NOT_SPECIAL_ACCOUNT, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else
            {
                //Extrae el id del tipo de cuenta especial seleccionado
                int idTipoCtaEsp = _specialTypeAccountIds[cmbTipoCuentaEsp.SelectedIndex];
                int idCtaNoEsp = _notSpecialAccountIds[lbCtaComp.SelectedIndex];
                
                ConfigurationManager.GetInstance().CreateNewSpecialAccount(idTipoCtaEsp, idCtaNoEsp);

                if (ConfigurationManager.GetInstance().IsError)
                    MessageBox.Show(ConfigurationManager.GetInstance().ErrorMessage, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                {
                    MessageBox.Show(MessageConstants.SPECIAL_ACCOUNT_INSERTED, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    //Actualiza los listBoxs
                    actualizarListas();
                }
            }

        }

        //Limpia los listBoxs y los actualiza
        private void actualizarListas()
        {
            lbCtaComp.Items.Clear();
            lbCtaEsp.Items.Clear();
            agregarCuentaEsp();
            agregarCuentaNoEsp();
        }

        // Funcion que elimina una nueva cuenta especial
        private void eliminarCuentaEsp()
        {
            if (lbCtaEsp.SelectedIndex == -1)
                MessageBox.Show(MessageConstants.NO_SELECTED_NOT_SPECIAL_ACCOUNT, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else
            {
                //Extrae el id del tipo de cuenta especial seleccionado
                int idTipoCtaEsp = _specialTypeAccountIds[cmbTipoCuentaEsp.SelectedIndex];
                int idCtaEsp = _specialAccountIds[lbCtaEsp.SelectedIndex];

                ConfigurationManager.GetInstance().DeleteSpecialAccount(idTipoCtaEsp, idCtaEsp);
                if (ConfigurationManager.GetInstance().IsError)
                    MessageBox.Show(ConfigurationManager.GetInstance().ErrorMessage, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                {
                    MessageBox.Show(MessageConstants.SPECIAL_ACCOUNT_DELETED, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    //Actualiza los listBoxs
                    actualizarListas();
                }
            }

        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            actualizarListas();
        }

        private void btnAgrega_Click(object sender, EventArgs e)
        {
            agregarNuevaCuentaEsp();
        }

        private void btnQuita_Click(object sender, EventArgs e)
        {
            eliminarCuentaEsp();
        }
    }
}
